其他
云原生网络代理 MOSN 多协议机制解析 | SOFAChannel#13 直播整理
<SOFA:Channel/>,有趣实用的分布式架构频道。回顾视频以及 PPT 查看地址见文末。 欢迎加入直播互动钉钉群 : 21992058,不错过每场直播。 本文根据 SOFAChannel#13 直播分享整理,主题:云原生网络代理 MOSN 多协议机制解析。
多协议机制产生的背景与实践痛点; 常见的协议扩展思路初探; SOFABolt 协议接入实践(重点); MOSN 多协议机制设计解读(重点); 后续规划及展望;
多协议机制产生的背景与实践痛点
相比编解码,协议自身的处理以及与框架集成才是其中最困难的环节,需要理解并实现包括请求生命周期、多路复用处理、链接池等等机制; 社区主流的 xDS 路由配置是面向 HTTP 协议的,无法直接支持私有协议,存在适配成本;
常见的协议扩展思路初探
SOFABolt 协议接入实践
任何协议特性以及协议功能都能在上面得到一些体现,例如有无 requestId/streamId 就直接关联到协议是否支持连接多路复用; 协议格式与报文模型直接相关,两者可以构成逻辑上的映射关系;而这个映射关系也就是所谓的编解码逻辑;
Name:协议名称,需要具备唯一性; Encoder:编码器,用于实现从报文模型到协议传输字节流的映射转换; Decoder:解码器,用于实现从协议传输字节流到报文模型的映射转换; Heartbeater:心跳处理,用于实现心跳保活报文的构造,包括探测发起与回复两个场景; Hijacker:错误劫持,用于在特定错误场景下错误报文的构造;
Basic:需要提供 GetStreamType、GetHeader、GetBody 几个基础方法,分别对应传输类型、头部信息、载荷信息; Multiplexing:多路复用能力,需要实现 GetRequestId 及 SetRequestId; HeartbeatPredicate:用于判断当前报文是否为心跳帧; GoAwayPredicate:用于判断当前报文是否为优雅退出帧; ServiceAware:用于从报文中获取 service、method 等服务信息;
根据报文扩展中的 GetStreamType 来确定当前报文是请求还是响应。如果是请求则继续 2; 根据报文扩展中的 HeartbeatPredicate 来判断当前报文是否为心跳包,如果是则继续 3; 当前报文是心跳探测(request + heartbeat),需要回复心跳响应,此时根据协议扩展中的 Heartbeater.Reply 方法构造对应的心跳响应报文; 再根据协议扩展的 Encoder 实现,将心跳响应报文转换为传输字节流; 最后调用 MOSN 网络层接口,将传输字节流回复给发起心跳探测的客户端;
MOSN 多协议机制设计解读
通过基于属性匹配(attribute-based)的模式,与具体协议字段解耦; 引入层级路由的概念,解决属性扁平化后带来的线性匹配性能问题; 通过变量机制懒加载的特定,按需实现深/浅解包;
匹配 Host(:authority) ; 匹配 Path ; 匹配 headers/args/cookies ;
匹配 $dubbo_service; 匹配 $dubbo_group; 匹配 $dubbo_version; 匹配 $dubboattachmentsxx;
封装编解码流程,抽象编解码能力接口作为协议扩展点 封装协议处理流程,抽象多路复用、心跳保活、优雅退出等能力接口作为协议扩展点
通过改为基于属性匹配的机制,与具体协议字段解耦,支持多协议适配; 引入层级路由机制,解决属性扁平化的匹配性能问题; 利用变量机制懒加载特性,按需实现深/浅解包;
后续规划及展望
MOSN Logo 社区投票结果公示
* 点下右下角“在看”
* 到公众号对话框发送“电脑包”,试试手气~
* 本期互动奖品“蚂蚁定制电脑内胆包”